package pl.gigiel.listonosz;

import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.util.Properties;

import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.filechooser.FileFilter;
import javax.swing.filechooser.FileNameExtensionFilter;

public interface IForm {
	@SuppressWarnings("serial")
	public class Window extends JFrame {

		File[] files;
		long[] tab_size;

		public Window() {

			JButton jbutton1 = new JButton("Wczytaj");
			jbutton1.setPreferredSize(new Dimension(140, 24));

			final JFileChooser jfilechooser = new JFileChooser();
			jfilechooser.setMultiSelectionEnabled(true);

			Container kontener = getContentPane();
			GridBagLayout gbl = new GridBagLayout();
			kontener.setLayout(gbl);

			GridBagConstraints wytyczne = new GridBagConstraints();
			wytyczne.insets = new Insets(5, 5, 5, 5);
			wytyczne.anchor = GridBagConstraints.CENTER;

			add(jbutton1, wytyczne, 0, 0, 1, 1);

			setTitle("Wysyłanie plików na pocztę e-mail");
			pack();
			setResizable(false);
			setVisible(true);

			jbutton1.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent e) {
					FileFilter filter = new FileNameExtensionFilter("PDF files", "pdf"); // jako
																							// domyślny
																							// format
																							// ustawiłem
																							// PDF
					jfilechooser.addChoosableFileFilter(filter); // ale można
																	// tego w
																	// ogóle nie
																	// robić
					jfilechooser.setFileFilter(filter);
					int ret = jfilechooser.showDialog(null, "Open file"); // wywołujemy
																			// okno
																			// "Open file"

					if (ret == JFileChooser.APPROVE_OPTION) {

						files = jfilechooser.getSelectedFiles();

						int ilosc_plikow = files.length; // sprawdzamy ile
															// plików zostało
															// wybranych
						String _ilosc_plikow = Integer.toString(ilosc_plikow); // konwersja
																				// Integer
																				// do
																				// String

						tab_size = new long[ilosc_plikow]; // stworzenie
															// obiektu, który
															// posłuży do
															// przechowywania
						// informacji o rozmiarze danego pliku

						for (int i = 0; i < ilosc_plikow; i++) { // pętla
																	// sprawdzająca
																	// i
																	// zapisująca
																	// rozmiar
																	// każdego
																	// pliku
							long size = files[i].length();
							tab_size[i] = size;
						}

						String[] dane = new String[ilosc_plikow]; // tablica
																	// potrzeba
																	// do
																	// wypisania
																	// informacji
																	// o plikach
						// (patrz: poniżej)

						for (int i = 0; i < ilosc_plikow; i++) {
							System.out.println("Trwa wysyłanie pliku/plików... Proszę cierpliwie czekać!");
							dane[i] = files[i].toString();
							try {
								send(dane[i], i); // wywołanie metody
													// wysyłającej pliki na
													// pocztę
							} catch (AddressException e1) {
								e1.printStackTrace();
							} catch (MessagingException e1) {
								e1.printStackTrace();
							}
						}

						System.out.println("Zakończono wysyłanie " + _ilosc_plikow + " pliku/plików");
					}
				}
			});
		}

		public void send(String filename, int i) throws AddressException, MessagingException {
			Properties props = new Properties();
			props.put("mail.smtp.host", "smtp.gmail.com"); // ustawienia
															// poprawne dla
															// poczty GMail
			props.put("mail.smtp.socketFactory.port", "465");
			props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
			props.put("mail.smtp.auth", "true");
			props.put("mail.smtp.port", "465");

			Session session = Session.getDefaultInstance(props, new javax.mail.Authenticator() // uruchamiamy
																								// sesję
					{
						protected PasswordAuthentication getPasswordAuthentication() {
							return new PasswordAuthentication("lucas.ciesielski", "123456789"); // <---
																								// podaj
																								// swój
																								// login
																								// i
																								// hasło
						}
					});

			Message message = new MimeMessage(session);
			message.setFrom(new InternetAddress("lucas.ciesielski@gmail.com")); // wskazujemy
																				// adres,
																				// z
																				// którego
																				// wysyłamy
			message.setRecipients(Message.RecipientType.TO, InternetAddress.parse("jan.kowalski@onet.pl")); // podajemy
																											// docelowy
																											// adres,
																											// na
																											// który
																											// ma
																											// trafic
																											// wiadomość
			message.setSubject(files[i].getName());

			MimeBodyPart messagePart = new MimeBodyPart();
			String bodyText = " "; // tutaj możemy dodać treść wiadomości e-mail
			messagePart.setText(bodyText);

			MimeBodyPart attachmentPart = new MimeBodyPart(); // fragment
																// odpowiadający
																// za dodawanie
																// załączników
			FileDataSource fileDataSource = new FileDataSource(filename) {
				public String getContentType() {
					return "application/octet-stream";
				}
			};
			attachmentPart.setDataHandler(new DataHandler(fileDataSource));
			attachmentPart.setFileName(files[i].getName()); // <----- w tym
															// miejscu
															// wskazujemy pliki
															// do wysłania
			// Wpisaliśmy je do tablicy w metodzie addActionListener przycisku

			Multipart multipart = new MimeMultipart(); // łączymy w całość tekst
														// wiadomości oraz
														// załączniki
			multipart.addBodyPart(messagePart);
			multipart.addBodyPart(attachmentPart);

			message.setContent(multipart);

			Transport.send(message); // na końcu wysyłamy całość

			System.out.println("Plik " + files[i].getName() + " (" + tab_size[i] + "b) został wysłany");
		}

		public void add(Component k, GridBagConstraints wytyczne, int x, int y, int h, int w) {
			wytyczne.gridx = x;
			wytyczne.gridy = y;
			wytyczne.gridwidth = h;
			wytyczne.gridheight = w;
			getContentPane().add(k, wytyczne);
		}
	}
}
